package com.qf.factory;

import com.qf.service.UserService;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;
import java.util.PropertyPermission;

/**
 *
 * 自定义的工厂类
 */
public class BeanFactory {

    //构造方法私有化
    private BeanFactory(){}
    //公共的访问来访问
   /* public static Object getBean(String beanName) throws  Exception{
        //读取resource类路径下的资源文件
        InputStream inputStream = BeanFactory.class.getClassLoader().
        getResourceAsStream("bean.properties");

        //创建属性集合列表
        Properties prop = new Properties() ;
        //将资源文件所在的输入流加载属性集合列表中
        prop.load(inputStream);


        //通过key获取value
        String userServiceClass = prop.getProperty("userService");
//        System.out.println(userServiceClass);

        //反射
        Class clazz = Class.forName(userServiceClass);
        //创建当前类实例
        Object obj = clazz.newInstance();
        return  obj ;


    }*/

    /**
     * 这个id就是我们需要解析xml文件里面的bean标签的唯一id标识符号
     * @param id
     * @return
     */
   public static Object getBean(String id) throws Exception{

       //dom4j: dom for Java 基于面向对象的解析xml文件的方式
       //读取xml文件获取根标签对象
       //创建解析器
       SAXReader saxReader = new SAXReader();
       //读取路径下的配置文件bean.xml
       InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("bean.xml");
       Document document = saxReader.read(inputStream) ;
       //  Document document = saxReader.read(new File("D:\EE_2113\day61\code\Spring_01\src\main\resources\bean.xml")); //必须里面绝对路径
       //获取当前的文档对象:bean.xml文档对象
       //利用dom4j里面有xpath表达式:可以快速定位到某个标签
    //获取到元素对象:bean标签对象
       //xpath "//不分层级关系选择标签"
       //bean["@id"]:表示带id属性的bean标签 值="userService"
       //定位到bean标签对象
       Element beanElement = (Element) document.selectSingleNode("//bean[@id='"+id+"']"); //id就是等会传递userService
       //通过标签对象获取class属性值的内容
       String userServiceImplClass = beanElement.attributeValue("class");
       //反射
       Class clazz = Class.forName(userServiceImplClass);
       Object obj = clazz.newInstance();
       return obj;


   }

    public static void main(String[] args) throws Exception {
        UserService userService = (UserService) BeanFactory.getBean("userService");
        System.out.println(userService);


    }
}
